package com.chub.study.modules.service.impl;

import cn.hutool.core.map.multi.AbsCollValueMap;
import cn.hutool.core.map.multi.CollectionValueMap;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONObject;
import com.chub.RespResult;
import com.chub.study.modules.service.FileProcessorService;
import com.chub.study.modules.service.FileReceiveService;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;

import java.util.ServiceLoader;

/**
 * @author : chub
 * @version : V1.0.0
 * @fileName : FileReceiveServiceImpl.java
 * @description : 接收文件服务 实现类
 * @createTime : 2024-08-01 15:56
 */
@Log4j2
@Service
public class FileReceiveServiceImpl implements FileReceiveService {
    /**
     * @description : 接收文件, 根据文件类型调用不同的处理类
     *
     * @param  : reqJson
     * @return : RespResult
     * @author : chub
     * @date   : 2024-08-01 20:09
     */
    @Override
    public RespResult receiveFile(JSONObject reqJson) {

        if (ObjectUtil.isEmpty(reqJson)) {
            log.info("请求参数为空。");
            return RespResult.success("处理失败，请求参数为空。");
        }

        String fileType = reqJson.getString("fileType");
        if (StrUtil.isEmpty(fileType)) {
            log.info("文件类型不能为空。");
            return RespResult.success("处理失败，文件类型不能为空。");
        }

        // @Service 注解告诉 Spring 框架将这个类实例化为一个 Bean，并将其纳入 Spring IoC 容器中
        // String serviceValue = "";
        String beanName = reqJson.getString("beanName");
        if (StrUtil.isEmpty(beanName)) {
            log.info("解析文件类名不能为空。");
            return RespResult.success("处理失败，解析文件类名不能为空。");
        }


        log.info("FileReceiveServiceImpl请求参数 = {}", reqJson);

        //使用jdk提供的类ServiceLoader来加载FileProcessorService的子类
        //  @AutoService(FileProcessorService.class)
        ServiceLoader<FileProcessorService> loaders = ServiceLoader.load(FileProcessorService.class);

        // 接收到文件后，将记录入库
        // 将文件做简单处理
        // 将文件上传到指定位置





        boolean matchFileFlag = false;
        // 遍历并调用子类方法，根据文件类型，调用不同的处理类
        for (FileProcessorService service : loaders) {

            if (service.matchFileType(fileType)) {
                log.info("匹配到的文件类型 = {}", fileType);
                matchFileFlag = true;
                return service.processor(reqJson);
            }

        }
        if (!matchFileFlag) {
            log.info("未匹配到的文件类型 = {}", fileType);
        }

        return RespResult.error("处理失败，未找到对应的处理类。");
    }

}
